package com.henrich.ccb.java8stream;

import java.util.*;

/**
 * <p>功能描述：聚合：max/min/count</p>
 * 在mysql中我们常用它们进行数据统计。Java stream中也引入了这些概念和用法，极大地方便了我们对集合、数组的数据统计工作
 * <p>修订记录</p>
 *
 * @Author xianghui.zh
 * @Version 1.0 2022/2/21
 **/
public class PolymerizationDemo {
    public static void main(String[] args) {
        // 案例一：获取String集合中最长的元素。
        List<String> stringList = Arrays.asList("str", "count", "messi", "zach", "person", "rashford");
        Optional<String> maxString = stringList.stream().max(Comparator.comparing(String::length));
        System.out.println("String集合中最长的元素：" + maxString.get());

        // 案例二：获取Integer集合中的最大值
        List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);
        // 自然排序
        Optional<Integer> max1 = list.stream().max(Integer::compareTo);
        System.out.println("自然排序Integer集合中的最大值: " + max1.get());
        // 自定义排序
        Optional<Integer> max2 = list.stream().max(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });
        System.out.println("自定义排序Integer集合中的最大值: " + max2.get());

        // 案例三：获取员工工资最高的人。
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Tom", 8900, 23, "male", "New York"));
        personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
        personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
        personList.add(new Person("Anni", 8200, 24, "female", "New York"));
        personList.add(new Person("Owen", 9500, 25, "male", "New York"));
        personList.add(new Person("Alisa", 7900, 26, "female", "New York"));
        Optional<Person> maxSalary = personList.stream().max(Comparator.comparingInt(Person::getSalary));
        Optional<String> maxSalaryPerson = personList.stream().max(Comparator.comparingInt(Person::getSalary)).map(Person::getName);
        System.out.println("获取员工工资最高的人: " + maxSalary.get().getSalary());
        System.out.println("获取员工工资最高的人: " + maxSalaryPerson.get());

        // 案例四：计算Integer集合中大于6的元素的个数
        List<Integer> list2 = Arrays.asList(7, 6, 4, 8, 2, 11, 9);
        long count = list2.stream().filter(x -> x > 6).count();
        System.out.println("集合中大于6的元素的个数: " + count);
    }
}
